//////////////////////////////////////////////////////////////////////////////////////////////////////
// 项目名   : Auto
// 文件名   : Auto.h
// 作者     : Aiye
// 日期     : 2025/8/15 10:39
// 邮箱     : 2878548868@qq.com
// 摘要     : Auto、decltype
//////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef AUTO_AUTO_H
#define AUTO_AUTO_H
#include <functional>
#include <iostream>
#include <string>

class Auto
{
public:
    /*
     * @brief 基本用法
     */
    Auto()
    {
        auto nVar{ 1 }; // 声明类型为整形
        auto dVar{ 1.0 }; // 声明类型为浮点型
        auto chVar{ "Hello World" }; // 声明类型为const char*
        std::string strVar{ chVar }; //
        auto pStrVar = strVar.data();

        // auto 自动类型推导会忽略顶层const保留底层const
        {
            const int nVar{ 1 };
            auto var{ nVar}; // 推导出来int类型，忽略顶层const

            const int* pVar{ &nVar };
            auto* pointer{ pVar }; //推导出const int* 保留底层const
            const int& rVar{ nVar };
            auto& ref{rVar}; // 推导出来 const int& 保留底层const

            // 不能使用auto 定义数组
            int arry[]{1,2,3,4,5};
            auto arr{arry}; // 被推断为int*
            // auto t2[]{arry}; // 无法定义数组

        }
    }

    /*
     * @brief 函数模板
     * @param[in] 模板var
     */
    void func(auto tVar)
    {
        std::cout << tVar;
    } // C++20 开始允许这种写法了 ,定义了一个函数模板

private:
    // auto _nVar{ 0 }; // 不能用于非静态成员变量的初始化
    // static auto s_nVarerr{ 0 }; // 非常量成员变量不允许类内初始化
    inline static auto s_nVar{ 0 }; // C++ 17 引入
    const static auto cs_nVar{ 0 }; // 常量静态成员变量允许类内初始化
};
#endif //AUTO_AUTO_H